/*
 * VCNL36825T_PS.h
 *
 * Created  : 13 April 2021
 * Modified : 3 May 2021
 * Author   : HWanyusof
 * Version	: 1.0
 */

#include "VCNL36825T_Prototypes.h"
#include "VCNL36825T.h"
#include "I2C_Functions.h"
#include "VCNL36825T_Application_Library.h"

extern int I2C_Bus;

//****************************************************************************************************
//*****************************************Sensor API*************************************************

/*Turn the PS Sensor On/Off
 *VCNL36825T_SET_PS_ON(Byte ps_on)
 *Byte ps_on - Input Parameter:
 *
 * VCNL36825T_PS_ON_EN
 * VCNL36825T_PS_ON_DIS
 */
void VCNL36825T_SET_PS_ON(Byte ps_on)
{
    struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF1_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_ON_EN|VCNL36825T_PS_ON_DIS))|ps_on;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the PS_CAL bit for initialization
 *VCNL36825T_SET_PS_CAL(Byte ps_cal)
 *Byte ps_cal - Input Parameter:
 *
 * VCNL36825T_PS_CAL_EN
 * VCNL36825T_PS_CAL_DIS
 */
void VCNL36825T_SET_PS_CAL(Byte ps_cal)
{
    struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF1_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_CAL_EN|VCNL36825T_PS_CAL_DIS))|ps_cal;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_LDO_EN))|VCNL36825T_PS_LDO_EN;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the PS_ST bit for initialization
 *VCNL36825T_SET_PS_ST(Byte ps_st)
 *Byte ps_st - Input Parameter:
 *
 * VCNL36825T_PS_ST_START
 * VCNL36825T_PS_ST_STOP
 */
void VCNL36825T_SET_PS_ST(Byte ps_st)
{
    struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_ST_START|VCNL36825T_PS_ST_STOP))|ps_st;;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);

	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_CAL_AUTO))|VCNL36825T_PS_CAL_AUTO;;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the PS measurement period
 *VCNL36825T_SET_PS_PERIOD(Byte ps_period)
 *Byte ps_period - Input Parameter:
 *
 * VCNL36825T_PS_PERIOD_10ms
 * VCNL36825T_PS_PERIOD_20ms
 * VCNL36825T_PS_PERIOD_40ms
 * VCNL36825T_PS_PERIOD_80ms
 */
void VCNL36825T_SET_PS_PERIOD(Byte ps_period)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_PERIOD_10ms|VCNL36825T_PS_PERIOD_20ms|VCNL36825T_PS_PERIOD_40ms|VCNL36825T_PS_PERIOD_80ms))|ps_period;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Persistence
 *VCNL36825T_SET_PS_PERS(Byte ps_pers)
 *Byte ps_pers - Input Parameter:
 *
 * VCNL36825T_PS_PERS_1
 * VCNL36825T_PS_PERS_2
 * VCNL36825T_PS_PERS_3
 * VCNL36825T_PS_PERS_4
 */
void VCNL36825T_SET_PS_PERS(Byte ps_pers)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_PERS_1|VCNL36825T_PS_PERS_2|VCNL36825T_PS_PERS_3|VCNL36825T_PS_PERS_4))|ps_pers;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Interrupt Mode
 *VCNL36825T_SET_PS_INT(Byte ps_int)
 *Byte ps_int - Input Parameter:
 *
 * VCNL36825T_PS_INT_DIS
 * VCNL36825T_PS_INT_LOGIC
 * VCNL36825T_PS_INT_FIRST_HIGH
 * VCNL36825T_PS_INT_EN
 */
void VCNL36825T_SET_PS_INT(Byte ps_int)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_INT_DIS|VCNL36825T_PS_INT_LOGIC|VCNL36825T_PS_INT_FIRST_HIGH|VCNL36825T_PS_INT_EN))|ps_int;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Enable/Disable Smart Persistence
 *VCNL36825T_SET_PS_SMART_PERS(Byte Pers)
 *Byte Pers - Input Parameter:
 *
 * VCNL36825T_PS_SMART_PERS_EN
 * VCNL36825T_PS_SMART_PERS_DIS
 */
void VCNL36825T_SET_PS_SMART_PERS(Byte Pers)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_SMART_PERS_DIS|VCNL36825T_PS_SMART_PERS_EN))|Pers;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Integration Time
 *VCNL36825T_SET_PS_IT(Byte IntegrationTime)
 *Byte IntegrationTime - Input Parameter:
 *
 * VCNL36825T_PS_IT_1T
 * VCNL36825T_PS_IT_2T
 * VCNL36825T_PS_IT_4T
 * VCNL36825T_PS_IT_8T
 */
void VCNL36825T_SET_PS_IT(Byte IntegrationTime)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_IT_1T|VCNL36825T_PS_IT_2T|VCNL36825T_PS_IT_4T|VCNL36825T_PS_IT_8T))|IntegrationTime;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Multi Pulse (MPS) setting
 *VCNL36825T_SET_PS_MPS(Byte ps_mps)
 *Byte ps_mps - Input Parameter:
 *
 * VCNL36825T_PS_MPS_1
 * VCNL36825T_PS_MPS_2
 * VCNL36825T_PS_MPS_4
 * VCNL36825T_PS_MPS_8
 */
void VCNL36825T_SET_PS_MPS(Byte ps_mps)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_MPS_1|VCNL36825T_PS_MPS_2|VCNL36825T_PS_MPS_4|VCNL36825T_PS_MPS_8))|ps_mps;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Integration Time Bank (Pulse Width)
 *VCNL36825T_SET_PS_ITB(Byte ps_itb)
 *Byte ps_itb - Input Parameter:
 *
 * VCNL36825T_PS_ITB_25
 * VCNL36825T_PS_ITB_50
 */
void VCNL36825T_SET_PS_ITB(Byte ps_itb)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_ITB_25|VCNL36825T_PS_ITB_50))|ps_itb;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Enable/Disable High Gain setting
 *VCNL36825T_SET_PS_HG(Byte ps_hg)
 *Byte ps_hg - Input Parameter:
 *
 * VCNL36825T_PS_HG_DIS
 * VCNL36825T_PS_HG_EN
 */
void VCNL36825T_SET_PS_HG(Byte ps_hg)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_HG_DIS|VCNL36825T_PS_HG_EN))|ps_hg;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Sensor Mode (Active Force or Auto Mode)
 *VCNL36825T_SET_PS_AF(Byte ps_af)
 *Byte ps_af - Input Parameter:
 *
 * VCNL36825T_PS_AF_EN
 * VCNL36825T_PS_AUTO
 */
void VCNL36825T_SET_PS_AF(Byte ps_af)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_AF_EN|VCNL36825T_PS_AUTO))|ps_af;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Enable/Disable Trigger for AF Mode
 *VCNL36825T_SET_PS_TRIG(Byte TriggerBit)
 *Byte TriggerBit - Input Parameter:
 *
 * VCNL36825T_PS_TRIG_EN
 * VCNL36825T_PS_TRIG_DIS
 */
void VCNL36825T_SET_PS_TRIG(Byte TriggerBit)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_TRIG_EN|VCNL36825T_PS_TRIG_DIS))|TriggerBit;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the detect cycle after trigger
 *VCNL36825T_SET_PS_FORCENUM(Byte ps_forcenum)
 *Byte ps_forcenum - Input Parameter:
 *
 * VCNL36825T_PS_FORCENUM_1
 * VCNL36825T_PS_FORCENUM_2
 */
void VCNL36825T_SET_PS_FORCENUM(Byte ps_forcenum)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_FORCENUM_1|VCNL36825T_PS_FORCENUM_2))|ps_forcenum;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Sunlight Protect
 *VCNL36825T_SET_PS_SP_INT(Byte ps_sp_int)
 *Byte ps_sp_int - Input Parameter:
 *
 * VCNL36825T_PS_SP_INT_DIS
 * VCNL36825T_PS_SP_INT_EN
 */
void VCNL36825T_SET_PS_SP_INT(Byte ps_sp_int)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_SP_INT_DIS|VCNL36825T_PS_SP_INT_EN))|ps_sp_int;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Enable/Disable the sunlight cancellation
 *VCNL36825T_SET_PS_SC(Byte ps_sc)
 *Byte ps_sc - Input Parameter:
 *
 * VCNL36825T_PS_SC_EN
 * VCNL36825T_PS_SC_DIS
 */
void VCNL36825T_SET_PS_SC(Byte ps_sc)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_SC_EN|VCNL36825T_PS_SC_DIS))|ps_sc;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Sensor output Bit Size
 *void VCNL36825T_SET_PS_HD(Byte ps_hd)
 *Byte ps_hd - Input Parameter:
 *
 * VCNL36825T_PS_HD_12Bits
 * VCNL36825T_PS_HD_16Bits
 */
void VCNL36825T_SET_PS_HD(Byte ps_hd)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_HD_12Bits|VCNL36825T_PS_HD_16Bits))|ps_hd;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the VCSEL current
 *VCNL36825T_SET_I_VCSEL(Byte i_vcsel)
 *Byte i_vcsel - Input Parameter:
 *
 * VCNL36825T_I_VCSEL_10mA
 * VCNL36825T_I_VCSEL_12mA
 * VCNL36825T_I_VCSEL_14mA
 * VCNL36825T_I_VCSEL_16mA
 * VCNL36825T_I_VCSEL_18mA
 * VCNL36825T_I_VCSEL_20mA
 */
void VCNL36825T_SET_I_VCSEL(Byte i_vcsel)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_I_VCSEL_10mA|VCNL36825T_I_VCSEL_12mA|VCNL36825T_I_VCSEL_14mA|VCNL36825T_I_VCSEL_16mA|VCNL36825T_I_VCSEL_18mA|VCNL36825T_I_VCSEL_20mA))|i_vcsel;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Low Threshold
 *VCNL36825T_SET_PS_LowThreshold(Word LowThreshold)
 *Word LowThreshold - Input Parameter:
 *
 * Value between 0d0 and 0d4095
 */
void VCNL36825T_SET_PS_LowThreshold(Word LowThreshold)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_THDL;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	Byte LowByte = LowThreshold;
	Byte HighByte = LowThreshold>>8;
	VCNL36825T_Data.WData[0] = LowByte;
	VCNL36825T_Data.WData[1] = HighByte;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the High Threshold
 *VCNL36825T_SET_PS_HighThreshold(Word HighThreshold)
 *Word HighThreshold - Input Parameter:
 *
 * Value between 0d0 and 0d4095
 */
void VCNL36825T_SET_PS_HighThreshold(Word HighThreshold)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_THDH;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	Byte LowByte = HighThreshold;
	Byte HighByte = HighThreshold>>8;
	VCNL36825T_Data.WData[0] = LowByte;
	VCNL36825T_Data.WData[1] = HighByte;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the PS Cancellation
 *VCNL36825T_SET_PS_CANC(Word CancelValue)
 *Word CancelValue - Input Parameter:
 *
 * Value between 0d0 and 0d4095
 */
void VCNL36825T_SET_PS_CANC(Word CancelValue)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CANC;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	Byte LowByte = CancelValue;
	Byte HighByte = CancelValue>>8;
	VCNL36825T_Data.WData[0] = LowByte;
	VCNL36825T_Data.WData[1] = HighByte;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Enable/Disable PS Auto Calibration
 *VCNL36825T_SET_PS_AC(Byte ps_ac)
 *Byte ps_ac - Input Parameter:
 *
 * VCNL36825T_PS_AC_EN
 * VCNL36825T_PS_AC_DIS
 */
void VCNL36825T_SET_PS_AC(Byte ps_ac)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_AC_EN|VCNL36825T_PS_AC_DIS))|ps_ac;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Auto Calibration sample period
 *VCNL36825T_SET_PS_AC_PERIOD(Byte ps_ac_per)
 *Byte ps_ac_per - Input Parameter:
 *
 * VCNL36825T_PS_AC_PERIOD_3ms
 * VCNL36825T_PS_AC_PERIOD_6ms
 * VCNL36825T_PS_AC_PERIOD_12ms
 * VCNL36825T_PS_AC_PERIOD_24ms
 */
void VCNL36825T_SET_PS_AC_PERIOD(Byte ps_ac_per)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_AC_PERIOD_3ms|VCNL36825T_PS_AC_PERIOD_6ms|VCNL36825T_PS_AC_PERIOD_12ms|VCNL36825T_PS_AC_PERIOD_24ms))|ps_ac_per;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the Auto Calibration sample number
 *VCNL36825T_SET_PS_AC_NUM(Byte ps_ac_num)
 *Byte ps_ac_num - Input Parameter:
 *
 * VCNL36825T_PS_AC_NUM1
 * VCNL36825T_PS_AC_NUM2
 * VCNL36825T_PS_AC_NUM4
 * VCNL36825T_PS_AC_NUM8
 */
void VCNL36825T_SET_PS_AC_NUM(Byte ps_ac_num)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_AC_NUM1|VCNL36825T_PS_AC_NUM2|VCNL36825T_PS_AC_NUM4|VCNL36825T_PS_AC_NUM8))|ps_ac_num;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Enable/Disable Trigger for Auto Calibration
 *VCNL36825T_SET_PS_AC_TRIG(Byte ps_ac_trig)
 *Byte ps_ac_trig - Input Parameter:
 *
 * VCNL36825T_PS_AC_TRIG_DIS
 * VCNL36825T_PS_AC_TRIG_EN
 */
void VCNL36825T_SET_PS_AC_TRIG(Byte ps_ac_trig)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_AC_TRIG_DIS|VCNL36825T_PS_AC_TRIG_EN))|ps_ac_trig;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Enable/Disable Auto Calibration Interrupt
 *VCNL36825T_SET_PS_AC_INT(Byte ps_ac_int)
 *Byte ps_ac_int - Input Parameter:
 *
 * VCNL36825T_PS_AC_INT_DIS
 * VCNL36825T_PS_AC_INT_EN
 */
void VCNL36825T_SET_PS_AC_INT(Byte ps_ac_int)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]&~(VCNL36825T_PS_AC_INT_EN|VCNL36825T_PS_AC_INT_DIS))|ps_ac_int;
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]);
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Set the detection Period at Low Power Mode
 *VCNL36825T_SET_PS_LPPER(Byte ps_lpper)
 *Byte ps_lpper - Input Parameter:
 *
 * VCNL36825T_PS_LPPER_40ms
 * VCNL36825T_PS_LPPER_80ms
 * VCNL36825T_PS_LPPER_160ms
 * VCNL36825T_PS_LPPER_320ms
 */
void VCNL36825T_SET_PS_LPPER(Byte ps_lpper)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_LPPER_40ms|VCNL36825T_PS_LPPER_80ms|VCNL36825T_PS_LPPER_160ms|VCNL36825T_PS_LPPER_320ms))|ps_lpper;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Enable/Disable Low Power Mode
 *VCNL36825T_SET_PS_LPEN(Byte ps_lpen)
 *Byte ps_lpen - Input Parameter:
 *
 * VCNL36825T_PS_LPEN_DIS
 * VCNL36825T_PS_LPEN_EN
 */
void VCNL36825T_SET_PS_LPEN(Byte ps_lpen)
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_H;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	VCNL36825T_Data.WData[0] = (VCNL36825T_Data.RData[0]);
	VCNL36825T_Data.WData[1] = (VCNL36825T_Data.RData[1]&~(VCNL36825T_PS_LPEN_DIS|VCNL36825T_PS_LPEN_EN))|ps_lpen;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Read Register value
 *VCNL36825T_READ_Reg(Byte Reg)
 *Byte Reg - Input Parameter:
 *
 * VCNL36825T_PS_CONF1
 * VCNL36825T_PS_CONF2
 * VCNL36825T_PS_CONF3
 * VCNL36825T_PS_THDL
 * VCNL36825T_PS_THDH
 * VCNL36825T_PS_CANC
 * VCNL36825T_PS_CONF4
 * VCNL36825T_PS_DATA
 * VCNL36825T_PS_INT_FLAG
 * VCNL36825T_PS_ID
 * VCNL36825T_PS_AC_DATA
 *
 *returns Register Value between 0d0/0x00 and 0d65535/0xFFFF
 *except for VCNL36825T_PS_THDH, VCNL36825T_PS_THDL & VCNL36825T_PS_CANC
 */
Word VCNL36825T_READ_Reg(Byte Reg)
{
	Word RegValue;
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = Reg;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	RegValue = VCNL36825T_Data.RData[1]<<8|VCNL36825T_Data.RData[0];
	return RegValue;
}

/*Read Proximity Data
 *VCNL36825T_GET_PS_DATA()
 *
 *returns PS Data between 0d0 and 0d65535
 */
Word VCNL36825T_GET_PS_DATA()
{
	Word ProxValue;
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_DATA;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	ProxValue = VCNL36825T_Data.RData[1]<<8|VCNL36825T_Data.RData[0];
	return ProxValue;
}

/*Read the PS Interruppt Flag
 *VCNL36825T_GET_PS_INT_FLAG() returns interrupt flag status.
 *Please refer to Table 13 in the Datasheet page 11
 */
Word VCNL36825T_GET_PS_INT_FLAG()
{
	int Interrupt;
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_INT_FLAG;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	Interrupt = VCNL36825T_Data.RData[1];
	return Interrupt;
}

/*Read the PS Interruppt Flag for auto calibration
 *VCNL36825T_GET_PS_AC_INT_FLAG() returns interrupt flag status.
 *Please refer to Table 13 in the Datasheet page 11
 */
Word VCNL36825T_GET_PS_AC_INT_FLAG()
{
	int Interrupt;
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_INT_FLAG;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	Interrupt = (VCNL36825T_Data.RData[1] & 0x20);
	return Interrupt;
}

/*Read Device ID
 *Returns ID
 */
Word VCNL36825T_GET_ID()
{
	Word Get_ID;
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_ID;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	Get_ID = VCNL36825T_Data.RData[1];
	return Get_ID;
}

/*Read Auto Calibration Data
 *VCNL36825T_GET_PS_AC_DATA()
 *
 *returns PS Data between 0d0 and 0d4095
 */
Word VCNL36825T_GET_PS_AC_DATA()
{
	Word Get_AC_Data;
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_AC_DATA;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	Get_AC_Data = (VCNL36825T_Data.RData[1]<<8|VCNL36825T_Data.RData[0]);
	Get_AC_Data = Get_AC_Data & 0x0FFF;
	return Get_AC_Data;
}

/*Read Auto Calibration Data Status
 *VCNL36825T_GET_PS_AC_DATA_STATUS()
 *
 *returns 0x80 when AC_BUSY, 0x40 when PS enters sunlight protect during auto-calibration
 */
Byte VCNL36825T_GET_PS_AC_DATA_STATUS()
{
	Word Get_AC_Data;
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_AC_DATA;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	Get_AC_Data = VCNL36825T_Data.RData[1];
    Get_AC_Data = Get_AC_Data & 0xC0;
	return Get_AC_Data;
}

/*Read the PS_ON bit
*returns 1 for Shutdown and 0 for Sensor On
*/
bool VCNL36825T_GET_PS_ON_Bit()
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF1_L;
    VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);

    if ((VCNL36825T_Data.RData[0] & 0x02) == 0x02 ){return 1;}
    else
    return 0;
}

/*Read the PS_AF bit
 *returns 1 for AF Mode and 0 for Auto Mode
 */
bool VCNL36825T_GET_PS_AF_Bit()
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_L;
    VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
    if((VCNL36825T_Data.RData[0] & 0x40) == 0x40){return 1;}
    else
    return 0;
}

/*Read the PS_AC bit
 *returns 1 for Auto Calibration Mode and 0 for Normal Mode
 */
bool VCNL36825T_GET_PS_AC_Bit()
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
    VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
	if((VCNL36825T_Data.RData[0] & 0x08) == 0x08){return 1;}
    else
    return 0;
}

/*Read the PS_AC_PERIOD bit
 *returns:
 * 0 - 3ms
 * 1 - 6ms
 * 2 - 12ms
 * 3 - 24ms
 */
int VCNL36825T_GET_PS_AC_PERIOD_Bit()
{
    int Period;

	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
    VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);

    if ((VCNL36825T_Data.RData[0] & 0xC0) == 0x00)
    Period = 0;
    if ((VCNL36825T_Data.RData[0] & 0xC0) == 0x40)
    Period = 1;
    if ((VCNL36825T_Data.RData[0] & 0xC0) == 0x80)
    Period = 2;
    if ((VCNL36825T_Data.RData[0] & 0xC0) == 0xC0)
    Period = 3;

    return Period;
}

/*Read the PS_AC_NUM bit
 *returns:
 * 0 - 1
 * 1 - 2
 * 2 - 4
 * 3 - 8
 */
int VCNL36825T_GET_PS_AC_NUM_Bit()
{
    int Num;

	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
    VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);

    if ((VCNL36825T_Data.RData[0] & 0x30) == 0x00)
    Num = 0;
    if ((VCNL36825T_Data.RData[0] & 0x30) == 0x10)
    Num = 1;
    if ((VCNL36825T_Data.RData[0] & 0x30) == 0x20)
    Num = 2;
    if ((VCNL36825T_Data.RData[0] & 0x30) == 0x30)
    Num = 3;
    return Num;
}

/*Read the PS_LPEN bit
 *returns 1 for Low Power Mode and 0 for Normal Mode
 */
bool VCNL36825T_GET_PS_LPEN_Bit()
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_H;
    VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	ReadI2C_Bus(&VCNL36825T_Data);
    if((VCNL36825T_Data.RData[1] & 0x01) == 0x01){return 1;}
    else
    return 0;
}

